// Copyright © 2016 Alan A. A. Donovan & Brian W. Kernighan.
// License: https://creativecommons.org/licenses/by-nc-sa/4.0/

// See page 261.
//!+

// Package bank provides a concurrency-safe bank with one account.
package bank

var deposits = make(chan int) // send amount to deposit
var balances = make(chan int) // receive balance

// Deposit Balance MARK 公开的函数,只能收发某channel,其他不管,并不共享变量
func Deposit(amount int) { deposits <- amount }
func Balance() int       { return <-balances }

func teller() {
	//MARK  balance 只在函数内
	var balance int // balance is confined to teller goroutine

	//MARK 死循环 出纳
	for {
		select {
		case amount := <-deposits:
			balance += amount
		case balances <- balance:
		}
	}
}

func init() {
	go teller() // start the monitor goroutine
}

//!-
